package net.dgg.robot.task.quartz;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SimplePropertyPreFilter;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * json工具类
 *
 * @author nature
 */
public class JsonUtil {

    /**
     * 对象到json字符串
     *
     * @param obj
     * @return
     */
    public static String obj2Json(Object obj) {
        return JSON.toJSONString(obj);
    }

    /**
     * 对象转换成json字符串，并排除某些字段
     *
     * @param obj         要转换的对象
     * @param excludeKeys 要排除的字段
     * @return
     */
    public static String obj2Json(Object obj, String... excludeKeys) {
        List<String> excludes = Arrays.asList(excludeKeys);
        SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
        filter.getExcludes().addAll(excludes);    //重点！！！
        return JSON.toJSONString(obj, filter);
    }

    /**
     * json字符串到对象
     *
     * @param jsonStr
     * @param objClass
     * @return
     */
    public static <T> T json2Obj(String jsonStr, Class<T> objClass) {
        T t = JSON.parseObject(jsonStr, objClass);
        return t;

    }

    /**
     * 反序列化java类型为数组
     *
     * @param jsonStr
     * @param objClass
     * @param <T>
     * @return
     */
    public static <T> List<T> json2List(String jsonStr, Class<T> objClass) {
        return JSON.parseArray(jsonStr, objClass);
    }

    /**
     * 反序列化json字符串为目标对象基类数组
     *
     * @param jsonStr          json字符串
     * @param objClass         对象的实际类型
     * @param destinationClass 返回值中的类型，这个类型必须为实际类型的基类，否则会出现异常
     * @param <T>              对象的实际类型
     * @param <TT>             返回值需要的类型
     * @return
     */
    public static <T, TT extends T> List<T> json2List(String jsonStr,
                                                      Class<TT> objClass, Class<T> destinationClass) {
        List<T> destinationList = new ArrayList<T>();
        List<TT> parseArray = json2List(jsonStr, objClass);
        for (T t : parseArray) {
            destinationList.add(t);
        }
        return destinationList;
    }
}
